package smallfrench.moteur.noeuds;

import smallfrench.moteur.biblio.err.ErreurRien;
import smallfrench.moteur.interp.Portee;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.interp.err.RException;
import smallfrench.moteur.lexer.lexemes.Lexeme;

public abstract class NOperateurUnaire extends Noeud {

	/**
	 * Noeud enfant
	 */
	protected Noeud enfant;

	public NOperateurUnaire(Lexeme t, Noeud enfant) {
		super(t);
		this.enfant = enfant;
	}

	@Override
	public final RObjet evaluer(Portee portee) {
		RObjet operande = enfant.evaluer(portee);
		if (operande == null) {
			throw ErreurRien.nouvelleException(lexeme.debut);
		}
		try {
			return evaluer(operande);
		} catch (RException e) {
			e.empilerSiAucune(lexeme.debut);
			throw e;
		}
	}

	protected abstract RObjet evaluer(RObjet operande);
}
